package com.cqie.uaa.controller;


import cn.dev33.satoken.annotation.*;
import cn.dev33.satoken.stp.StpUtil;
import com.cqie.result.Result;
import com.cqie.uaa.service.UserService;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import lombok.extern.slf4j.Slf4j;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;

import org.springframework.web.bind.annotation.RestController;

import javax.annotation.Resource;
import java.util.ArrayList;
import java.util.List;

/**
 * <p>
 * 前端控制器
 * </p>
 *
 * @author 小飞
 * @since 2024-04-16
 */
@RestController
@RequestMapping("/user/")
@Api(tags = "用户信息管理")
@Slf4j
public class UserController {
    @Resource
    private UserService userService;

    /**
     * 登录
     *
     * @param username
     * @param password
     * @return
     */
    @GetMapping("doLogin")
    public Result doLogin(String username, String password) {
        //此处仅做模拟,真实情况,要查询数据库

        if (userService.doLogin(username, password)) {
            return Result.success("登陆成功");
        }
        return Result.error("登陆失败");
    }

    /**
     * 查询登录页状态
     *
     * @return
     */
    //@SaCheckLogin //查看是否已经登录,已经登录才可以访问这个接口
    //只要满足了里面的一个文件条件就行
    @SaCheckOr(
            login = @SaCheckLogin,
            role = @SaCheckRole("admin"),
            permission = @SaCheckPermission("user.get"),
            safe = @SaCheckSafe("update.password"),
            basic = @SaCheckBasic(account = "sa:123456"),
            disable = @SaCheckDisable("submit-orders")
    )
    @ApiOperation("是否登录")
    @GetMapping("isLogin")
    public Result isLogin() {
        return Result.success("当前的登录状态为", StpUtil.isLogin());
    }

    /**
     * 查询token信息
     *
     * @return
     */
    @SaCheckRole("user")
    @GetMapping("tokenInfo")
    public Result tokenInfo() {
        return Result.success(StpUtil.getTokenInfo());
    }

    /**
     * 获取角色权限集合
     * @return
     */
    @SaCheckPermission(value = "qwewe",orRole = "admin") //双重or,表示权限为qweqwe或者角色权限为admin
    @GetMapping("getPermissionList")
    public Result getPermissionList() {
        List<Boolean> booleanList = new ArrayList<>();
        //获取该角色权限集合
        List<String> permissionList = StpUtil.getPermissionList();
        log.info("全部权限信息为:{}",permissionList);
        //判断当前账号是否含有指定权限，返回true或者false
        boolean b = StpUtil.hasPermission("user.add");
        booleanList.add(b);
        // 校验：当前账号是否含有指定权限, 如果验证未通过，则抛出异常: NotPermissionException
        StpUtil.checkPermission("user.add");

        // 校验：当前账号是否含有指定权限 [指定多个，必须全部验证通过]
        StpUtil.checkPermissionAnd("user.add", "user.get");

        // 校验：当前账号是否含有指定权限 [指定多个，只要其一验证通过即可]
        StpUtil.checkPermissionOr("user.add", "user.delete", "user.get");
        boolean hassed = StpUtil.hasPermission("art.add");
        booleanList.add(hassed);
        return Result.success(booleanList);
    }

    @GetMapping("logout")
    public Result logout(Long id){
        //强制下线
        StpUtil.logout(id);                                      // 强制指定账号注销下线
//        StpUtil.logout(10001, "PC");              // 强制指定账号指定端注销下线
//        StpUtil.logoutByTokenValue("token");      // 强制指定 Token 注销下线
        //踢人下线
//        StpUtil.kickout(10001);                    // 将指定账号踢下线
//        StpUtil.kickout(10001, "PC");              // 将指定账号指定端踢下线
//        StpUtil.kickoutByTokenValue("token");      // 将指定 Token 踢下线
        return Result.success();
    }

}

